

                     L                ZZZZZZ         RRRRR           SSSSS
                     L                    Z          R    R         S
                     L          aaa      Z      aaa  R    R  u   u  S
                     L            a     Z         a  RRRRR   u   u  SSSSS
               XX    L         aaaa    Z       aaaa  R    R  u   u       S
              XXXX   L        a   a   Z       a   a  R    R  u   u       S
             XXXXXX  LLLLLLL  aaaaa  ZZZZZZZ  aaaaa  R    R  uuuuu  SSSSSS
             XXXXXX       
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
             XXXXXX
             XXXXXX
              XXXX        proudly presents his 27.Cracking Tutorial (31.07.1999)
               XX                       tKC's CiA Trial CrackMe 0.99

I.    Vorwort
I.1   Die Tools
II.   Das Tut
III.  BTW

I.   Dieses Tutorial geht nicht nur darum ein bestimmtes Programm zu cracken, sondern auch um
     eines (fr mich) faszinierendsten Dinge die man berhaupt mit einer EXE Datei machen kann:
     Dem Umleiten der ASM-Befehle zu hinzugefgten Befehlen, so dass man sogar in der Lage ist
     gepackte Dateien zu patchen. Die Arbeit an diesem CrackMe ist eine Co-produktion zwischen
     mir (einfacherer Teil) und R!SC (schwererer Teil). Spter werde ich weiter auf die 
     Verteilung eingehen.

I.1  Die Tools
     Einer dieser seltenen Flle, bei denen ich gezwungen war von meinem geliebten W32Dasm 
     Debugger Abstand zu nehmen: Also SoftIce (diesmal).
     Ein Hexeditor wird auch bentigt und bevor ichs vergesse: Procdump

II.  Das Tut
     Um das CrackMe zu lsen muss man einen Nagscreen wegpatchen, eine Serial herausbekommen und
     eine gltige Name/Serial Kombination ermitteln. Fangen wir mit der ersten Serial an (TryMe
     #1), da diese am einfachsten ist.
     Startet TryMe #1 und gebt irgendeine Serial ein. Ich nehme wie immer 666999. Jetzt startet
     SICE und setzt einen Breakpoint auf hmemcpy (bpx hmemcpy). Verlasst SICE und drckt den
     OK Button. Das SICE Fenster wird wieder aktiviert und jetzt msst ihr solange [F12] drcken
     bis ihr in "ntzlichen" Regionen seid. Ntzlicher Code hat diese Adressen-Struktur:
     XXXX:XXXXXXXX (nicht XXXX:XXXX) und es erscheint kein "ret" in den nchsten paar Codezeilen.
     In diesem Falle kommt man zu :0045AEAB. Jetzt noch kurz mit [F10] durch den Code tracen,
     bis ihr an :0045AEBF ankommt. Wenn man "d eax" eingibt, erscheint die Serial, die man
     eingegeben hat, benutzt man "d edx" erscheint: 
     4E0A5C9B70A48ID501266ECB59423%9EAA0C58E844C7E9EE - Sollte dies wirklich die richtige Serial
     sein? Raus aus SICE und ausprobieren (Ihr habt Glck, ihr habt Copy/Paste ;) Ja, es ist
     wirklich die richtige Serial.
     Also weiter zu TryMe #2. Jetzt soll man eine korrekte Serial fr seinen Namen ermitteln.
     Auch dieser Teil wurde zuerst von mir gelst (ist ja auch noch leicht). TryMe #2 starten
     und einen Namen und eine Fake-Serial eingeben. Ich nehme LaZaRuS und 666999. In SICE und
     erneut einen bpx auf hmemcpy setzen. Raus aus SICE und den OK Button drcken. Das SICE
     Fenster erscheint wieder. Jetzt hat das CrackMe jedoch erst den Text aus einem Eingabefeld
     eingelesen. Also [CTRL]+[D] drcken und raus aus SICE. SICE wird sofort wieder erscheinen,
     da dann der Text vom zweiten Textfeld eingelesen wird. Wieder mit [F12] "ntzlichen" Code
     suchen. Diesmal :0045FA6C. Man muss nur noch einmal F10 drcken. Wenn man dann "d edx"
     eingibt, kann man seinen Namen im Hexfenster (was weis ich wie das offiziell heisst) sehen
     und eine Zeile tiefer: $21C5249D - Sollte das die richtige Serial fr LaZaRuS sein. "BC*"
     um alle Breakpoints zu lschen und raus aus SICE. Name und Serial eingeben und man sieht:
     "Congratz! Contact CiA to get your trial status!". Naja, so voreilig sind wir mal nicht.
     Es fehlt immer noch der Nagscreen.
     btw: R!SC hat es natrlich auch geschafft dieses CrackMe zu cracken. Seine Kombination ist
     R!SC / $C9ECB75B.

     Eigentlich ist ja selten (bei "normalen" Umstnden) etwas schweres dran einen Nagscreen zu
     patchen. Diesmal wird der Schwierigkeitsgrad jedoch etwas angehoben durch die Tatsache
     das die EXE-Datei mit Shrinker (3.3 glaub ich) gepackt ist. Da entpacken doch recht lame
     ist und ich auch keinen Processpatcher einsetzen wollte (auch nicht besser) musste ich mich
     nach einer Alternative umsehen. Glcklicherweise half mir Phantasm, der mir ein Tut ber
     mein Problem (Patchen von Shrinker-gepackten Dateien von R!SC) mailte. Ich wrde vorschlagen
     das es sich der lernwillige Leser *sofort* besorgt. So begann ich zu arbeiten. Das Byte,
     dass es zu patchen galt war schnell gefunden - :00459BC2 (R!SC, den ich um Untersttzung
     bat, fand sogar noch ein besseres - :00460164). (Wer die Methode wissen will, mit der ich
     auf die Bytes kam, sollte entweder mir mailen oder mein Tut Nummer [Wasweisich] lesen.
     Bei jedem der jetzt weiterliest, setze ich vorraus, dass er entweder R!SC's tut durchgelesen
     hat oder wenigstens eine grobe Vorstellung hat, wie man Assembleranweisungen in ungenutzte
     Teile der EXEDatei umleitet und eigenen Code hinzufgt.
     Das erste was wir bentigen ist der "Entry point" des Programms. Normalerweise geht das
     einfach mit dem SICE Symbol Loader. Leider funktioniert er hier nicht. Es gibt einen 
     alternativen Weg: Startet Procdump und ladet das CrackMe in den PE-Editor. Jetzt sieht man,
     dass der Entry Point bei 8C3DA ist. Jetzt noch schnell in die "Sections" sehen und eine
     Section suchen, die nahe am Entry Point liegt. Diesmal ist das ".load" bei 8B000. In der
     EXE Datei beginnt die .load Sektion bei 2800 (Raw Offset). Jetzt kann man ganz einfach mit
     8C3DA-8B000+2800=3BDA den richtigen Entry Point bestimmen: 3BDA. Aber wie schaffen wirs 
     jetzt, dass SICE hier aktiviert wird. ndert einfach das Offset an 3BDA in CC. Das ist der
     Op-Code fr INT03. Jetzt setzt in SICE mit "bpint 03" einen Breakpoint auf INT03. 
     Wenn man jetzt das CrackMe startet, wird SICE ganz am Anfang aktiv. Jetzt mssen wir die
     Vernderungen rckgngig machen (sonst machts Crash). Man macht das mit "e eip 83", weil
     vorher das Offset 83h war. Jetzt kann man mit "tracen" anfangen (F10). Wenn man ber den
     Call an :0048C45C tracet, erscheint der Nag-Screen, also mssen wir da rein (F8). Jetzt
     weitertracen bis man an "Call [ebp-20]" kommt. Das ist das Ende der Shrinker Sektion 
     (glaubts mir einfach, es ist so ;). Notiert euch die Hexcodes des Calls und des vorherigen
     push: FF7508FF55E0 - Sucht dies im Hexeditor und notiert das Offset: 3CDC. Alles schn und
     gut, aber was brint das? Kurz gesagt: Wir mssen die ASM-Anweisungen am Ende der Shrinker
     Sektion umleiten in Code der die EXEDatei patcht (den wir natrlich auch noch schreiben
     mssen) und dann normal im Programm weitermachen. Als erstes brauchen wir unbenutzte Teile
     der EXE-Datei (R!SC hat sich 5530 ausgesucht, ich etwas anderes, aber machen wir mit R!SC's
     Offset weiter. Unbenutzer Code ist ein grosser Block von 00h (wir brauchen aber nur 10 Byte
     oder so). Irgendwie mssen wir diesen Teil ja in SICE wiedererkennen, also geben wir hier
     einen Text ein: Ich nehme "lazarro" (Vorsicht: Wer "GotYa" oder "HelloWorld" nimmt, 
     erwischt auf unerklrliche Weise Op-Codes, die einen Reboot verursachen).
     Jetzt SICE starten und bis zum letzten Push vor "Call [ebp-20]" vorrcken. Dann nach
     "lazarro" suchen (s 0 l ffffffff 'lazarr'). Man findet es an :0048DD30. Dahin mssen wir
     die Instruktionen umleiten. "a eip" eingeben, damit man die aktuelle Anweisung ndern kann.
     ndert diese in "jmp 48DD30". Jetzt weitertracen und man landet bei lazarro. Jetzt kam
     mein grosses Problem: Ich dachte die Datei wre 4mal gepackt, sie ist aber nur 1mal gepackt
     und 3mal verschlsselt. Also hab ich R!SC "angebettelt" mir zu helfen. Er erkannte meine
     Blindheit und teilte mir mit, dass jedes Byte der Datei verschlsselt wurde, indem 7Bh
     addiert wurde (3*7Bh genauer). Wenns nicht verschlsselt gewesen wre, wrs simpler 
     geworden. Jetzt aber zum patchen. Gebt "a eip" ein und danach die folgenden Anweisungen.

     mov byte ptr [460164], B8  // ndert CALL zu MOV
     push dword ptr [ebp+08]    // der Push, den wir mit dem JMP berschrieben
     call [ebp-20]              // und weiter im Programm

     Eigentlich - wenn nix verschlsselt wre - msste man das Byte in B8 ndern. So muss man 
     aber 3*7Bh subtrahieren. Das ergibt dann 29h. Jetzt msste der Nagscreen verschwunden sein
     und das Programm laufen. Wenn nicht, habt ihr einen Fehler gemacht. Lest dieses Tut und
     R!SC's tut erneut und ihr bekommt den Bogen raus. Wenn alles funktioniert hat, macht das
     ganze nochmal und schreibt die Bytes auf, die die drei Anweisungen darstellen. Es sind
     C6056401460029FF7508FF55E0. Diese msst ihr im Hex-Editor an Offset 5530 eintragen, da die
     Vernderungen, die man in SICE macht ja nur im RAM sind. Ausserdem msst ihr den PUSH/CALL
     an Offset 3CDC in einen JMP patchen. Die Op-Codes hierfr sind E94F180000. Jetzt ist der
     Nag fr immer verschwunden.

     Das wars dann auch schon: Ich mchte R!SC fr seine Untersttzung und Phantasm fr R!SC's
     Tut danken. R!SC's Hilfe findet ihr in "risc.txt"
     Der Patch wurde mit der Patchengine von Eternal Bliss und Borna Janes gemacht.
 
III. BTW
     
     Wenn ihr irgenwelche Fragen habt: Ihr findet mich in #cracking4newbies und #cug
     (fast jeden Abend), ihr knnt mir mailen (lazarus_hf@hotmail.com) und ihr knnt meine
     Site besuchen: hello.to/lazarus